package com.lp.syn_test;

public class SynchronizedCodeBlockTest implements Runnable{
    private Object lock = new Object();
    private static int i=0;//共享资源
    public static void main(String[] args) throws InterruptedException {
        //同一实例对象
        SynchronizedCodeBlockTest st = new SynchronizedCodeBlockTest();
        Thread t1 = new Thread(st);
        Thread t2 = new Thread(st);
        t1.start();
        t2.start();
        //join()的作用让调用该方法的线程在执行完run()方法后，再执行join()方法后面的代码。
        t1.join();
        t2.join();
        System.out.println(i);
        //不同实例对象,无法保证线程安全
//        SynchronizedCodeBlockTest st1 = new SynchronizedCodeBlockTest();
//        SynchronizedCodeBlockTest st2 = new SynchronizedCodeBlockTest();
//        Thread t1 = new Thread(st1);
//        Thread t2 = new Thread(st2);
//        t1.start();
//        t2.start();
//        //join()的作用让调用该方法的线程在执行完run()方法后，再执行join()方法后面的代码。
//        t1.join();
//        t2.join();
//        System.out.println(i);

//        for (int j = 0; j < 10; j++) {
//            int i = st.getKey1().hashCode();
//            System.out.println(i);
//        }

    }

    @Override
    public void run() {
        synchronized (getKey1()){
            for (int j = 0; j < 1000000; j++) {
                i++;
            }
        }
    }

    /**
     * 利用下面的getKey做锁对象时注意
     * getKey1的锁对象不唯一，无法保证线程安全
     * getKey2的锁对象唯一，能够保证线程安全
     */
    public String getKey1(){
        String s = "1";
        System.out.println("1---"+s.hashCode());
        s += "2";
        System.out.println("2---"+s.hashCode());
        return s;
    }

    public String getKey2(){
        String s = "1";
        return s;
    }
}
